let util = require('../../utils/util')
const app = getApp()

// pages/family/edit_attr.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    family: 0,   //从哪个家族进入
    person: 0,
    scroll_height: 0,  //scroll-view的固定高度，单位像素
    attr_lst: [],   //已有属性id大于0， 固定属性id依次取：-1，-2，-3... ， 新增属性id从-10000开始取。不同的属性id不一样。
    attr_lst_bk: [],  //存储初始获取到的列表数据
    select_id: 0,   //当前选中属性的id
    curr_new_id: -10000,
    buttons: [{text: '取消'}, {text: '确定'}],
    showDialog: false,  //是否显示编辑框
    dialog_tag: "",    //编辑框标志，取edit或add, 用来区分不同的编辑框
    dialog_title: "",  //编辑框标题
    dialog_input_emptytxt: "",  //编辑框编辑控件placehlder
    dialog_input_focus: false,  //编辑框编辑控件是否有焦点，直接写死没效果， 要这样写。
    dialog_input_value: "",     //编辑框编辑控件当前内容。 主动更新值可以用绑定属性，被动监听值的更新则必须用回调。
  },

  //更新所有属性
  updateAttrList(res) {
    for (let i = 0; i< res.length; i++) {
      if (res[i].id == this.data.select_id) {
        res[i].checked = true
      } else {
        res[i].checked = false
      }
    }
    this.setData({
      attr_lst: res,
      attr_lst_bk: util.deepCopy(res)
    })
    if (this.data.select_id <= -10000) {
      //新增属性清空
      this.setData({
        select_id: 0
      })
    }
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    console.log('enter attr: ', options)
    this.setData({
      family: parseInt(options.family),
      person: parseInt(options.person)
    })

    app.httpRequest('get_person_attrs', {
      family: this.data.family,
      target_person: this.data.person
    }, res => {
      console.log('get attr list: ', res)
      this.updateAttrList(res)
    }, res => {
      console.log('get attr list failed: ', res)
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    wx.createSelectorQuery()
    .select('.family_lst_container')
    .fields({
      size: true
    })
    .exec(this.init.bind(this))
  },

  init(res) {
    const width = res[0].width
    const height = res[0].height
    this.setData({
      scroll_height: height
    })
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },

  //选择家族
  OnRadioChange(e) {
    console.log('radio发生change事件，携带value值为：', e)

    let items = this.data.attr_lst
    for (let i = 0, len = items.length; i < len; ++i) {
      items[i].checked = items[i].id == e.detail.value
      if (items[i].checked) {
        this.setData({
          select_id: items[i].id
        })
      }
    }
    this.setData({
      attr_lst: items
    })
  },

  bindMoveUp(e) {
    let items = this.data.attr_lst
    let hasSelect = false
    for (let i = 0; i < items.length; i++) {
      if (items[i].id == this.data.select_id) {
        hasSelect = true
        if (items[i].fix == 1){
          app.showTip("固定属性不能调整顺序")
        } else {
          if (0 == i) {
            app.showTip("已经在最上面了")
          } else {
            let upItem = items[i-1]
            let downItem = items[i]
            items[i-1] = downItem
            items[i] = upItem
          }
        }
        break
      }
    }

    if (!hasSelect) {
      app.showTip("请先选中属性")
    }

    this.setData({
      attr_lst: items
    })
  },

  bindMoveDown(e) {
    let items = this.data.attr_lst
    let hasSelect = false
    for (let i = 0; i < items.length; i++) {
      if (items[i].id == this.data.select_id) {
        hasSelect = true
        if (items[i].fix == 1){
          app.showTip("固定属性不能调整顺序")
        } else {
          if (items.length - 1 == i) {
            app.showTip("已经在最下面了")
          } else {
            let upItem = items[i]
            let downItem = items[i + 1]
            items[i] = downItem
            items[i + 1] = upItem
          }
        }
        break
      }
    }

    if (!hasSelect) {
      app.showTip("请先选中属性")
    }

    this.setData({
      attr_lst: items
    })
  },

  bindEdit(e) {
    let items = this.data.attr_lst
    for (let i = 0; i < items.length; i++) {
      if (items[i].id == this.data.select_id) {
        if (items[i].fix == 1) {
          app.showTip("固定属性不能编辑名称")
        } else {
          this.showDialog("edit", "编辑属性名称", items[i].attr_name)
        }
        return
      }
    }
    app.showTip("请选中属性")
  },

  bindAdd(e) {
    this.showDialog("add", "请输入新增属性名称", "")
  },

  showDialog(tag, title, input_empty_txt) {
    this.setData({
      dialog_tag: tag,
      dialog_title: title,
      dialog_input_emptytxt: input_empty_txt,
      dialog_input_value: input_empty_txt,
      showDialog: true,
      dialog_input_focus: true
    })
  },

  tapDialogButton(e) {
    if (e.currentTarget.dataset.tag == "edit") {
      //编辑
      if (e.detail.item.text == "确定") {
        this.setData({
          showDialog: false
        })

        let items = this.data.attr_lst
        for (let i = 0; i < items.length; i++) {
          if (items[i].id == this.data.select_id) {
            if (items[i].fix == 0) {
              items[i].attr_name = this.data.dialog_input_value
            }
            break
          }
        }
        this.setData({
          attr_lst: items
        })

      } else {
        this.setData({
          showDialog: false
        })
      }
    } else if (e.currentTarget.dataset.tag == "add") {
      //新增
      if (e.detail.item.text == "确定") {
        this.setData({
          showDialog: false
        })

        let items = this.data.attr_lst
        //取消选中之前的, 选中新增的
        for (let i = 0; i< items.length; i++) {
          items[i].checked = false
        }
        let newItem = {}
        newItem.id = this.data.curr_new_id
        this.data.curr_new_id--
        newItem.fix = 0
        newItem.attr_name = this.data.dialog_input_value
        newItem.checked = true
        items.push(newItem)

        this.setData({
          attr_lst: items,
          select_id: newItem.id
        })

      } else {
        this.setData({
          showDialog: false
        })
      }
    }

  },

  OnAttrNameInput(e) {
    this.data.dialog_input_value = e.detail.value
  },

  bindDel(e) {
    let items = this.data.attr_lst
    for (let i = 0; i < items.length; i++) {
      if (items[i].id == this.data.select_id) {
        if (items[i].fix == 0) {
          //删除当前选中属性，并默认选中下一个
          items.splice(i, 1)
          let new_select_id = 0
          if (items.length > i) {
            items[i].checked = true
            new_select_id = items[i].id
          }
          this.setData({
            attr_lst: items,
            select_id: new_select_id
          })
        } else {
          app.showTip("固定属性不能删除")
        }
        return
      }
    }
    app.showTip("请先选择属性")
  },

  bindConfirm(e) {
    //搜集将要删除的属性
    let remove_attrs = []
    for (let i = 0; i < this.data.attr_lst_bk.length; i++) {
      let item = this.data.attr_lst_bk[i]
      if (item.fix == 0 && this.data.attr_lst.filter((elem) => elem.id == item.id).length == 0) {
        remove_attrs.push(item.attr_name)
      }
    }
    if (remove_attrs.length > 0) {
      wx.showModal({
        title: '提示',
        content: '删除了属性：' +remove_attrs.join('、') + '，相应的值也会删除，' + ' 确定要保存吗？',
        success: (res) => {
          if (res.confirm) {
            this.doUpdate()
          } else if (res.cancel) {
            // console.log('用户点击取消')
          }
        }
      })
    } else {
      this.doUpdate()
    }
  },

  //请求后台执行更新操作
  doUpdate() {
    let bk_ids = []  //获取到编辑前所有自定义属性id, 用来和后台比对获取之后有没有更新
    for (let i = 0; i < this.data.attr_lst_bk.length; i++) {
      let item = this.data.attr_lst_bk[i]
      if (item.fix == 0 && item.id > 0) {
        bk_ids.push(item.id)
      }
    }

    app.httpRequest('set_person_attrs', {
      family: this.data.family,
      target_person: this.data.person,
      old_attrs: bk_ids,
      new_attrs: this.data.attr_lst
    }, res => {
      console.log('update attr list: ', res)
      this.updateAttrList(res)
      // app.showOkTip("更新成功")

      //返回
      let pages = getCurrentPages()  //获取当前页面js里面的pages里的所有信息。
      let prevPage = pages[pages.length - 2]  //prevPage 是获取上一个页面的js里面的pages的所有信息。 -2 是上一个页面，-3是上上个页面以此类推。
      prevPage.refreshAttr()
      
      wx.navigateBack()
    }, res => {
      console.log('update attr list failed: ', res)
    })
  }
})